/*
// =====================================================================================
// 
//       Filename:  gzlib_mm_seg.hpp
// 
//    Description:  分段内存管理，适用于小块不定长内存的频繁申请释放
// 
//        Version:  1.0
//        Created:  09/02/2013 05:03:00 PM
//       Revision:  none
//       Compiler:  g++
// 
//         Author:  Elwin.Gao (elwin), elwin.gao4444@gmail.com
//        Company:  
// 
// =====================================================================================
*/

#ifndef  _GZLIB_MM_SEG_H_
#define  _GZLIB_MM_SEG_H_

#include "gzlib_util.hpp"
#include "gzlib_lock.hpp"

struct mem_seg_node {
	char *head;
	long offset;
};

// =====================================================================================
//        Class:  GZ_MM_Seg
//  Description:  
// =====================================================================================
class GZ_MM_Seg
{
public:
	// ====================  LIFECYCLE     =======================================
	GZ_MM_Seg()
	{
		seg_size = 0;
		seg_max = 0;
		current = 0;
		mem_list = NULL;
	}

	~GZ_MM_Seg()
	{
		if (mem_list)
			destroy();
	}

	// ====================  INTERFACE     =======================================
	
	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  init
	//  Description:  初始化段长（指定幂次）,和最多段个数（指定幂次）
	// =====================================================================================
	*/
	int init(size_t seg_size_pow = 20, size_t seg_max_pow = 10);

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  alloc
	//  Description:  分配内存，成功返回内存地址，失败返回NULL
	// =====================================================================================
	*/
	void* alloc(size_t size);

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  recycle
	//  Description:  尝试回收内存，并再利用，牺牲效率减缓内存增长的速度
	// =====================================================================================
	*/
	void recycle(void* pointer);

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  clear
	//  Description:  释放申请过的所有内存
	// =====================================================================================
	*/
	void clear();

	/* 
	// ===  FUNCTION  ======================================================================
	//         Name:  destroy
	//  Description:  销毁对象
	// =====================================================================================
	*/
	void destroy();

private:
	// ==================== PRIVATE METHOD =======================================

	// ====================  DATA MEMBERS  =======================================
	size_t seg_size;
	size_t seg_max;
	size_t current;
	struct mem_seg_node *mem_list;

	GZ_Mutex_Lock locker;
};		// -----  end of class GZ_MM_Seg  -----


#endif   // ----- #ifndef _GZLIB_MM_SEG_H_  -----
